import java.util.ArrayList;

/**
 * @description:
 * @Author: wuzhenbin
 * @CreateTime: 2025-02-07
 */
public class leetcode_283 {
    public static void main(String[] args) {
        int[] ints = {1,2};
        moveZeroesNew1(ints);
    }

    private static void swap(int[] ints,int a, int b){
        int tmp;
        tmp = ints[a];
        ints[a] = ints[b];
        ints[b] = tmp;
    }
    public static void moveZeroes(int[] nums) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            if(nums[i] == 0){
                list.add(i);
            }
        }
        for (int i = list.size()-1; i >=0 ; i--) {
            int zero = list.get(i);
            for (int j = zero; j < nums.length; j++) {
                while(j<nums.length-1&&nums[j+1]!=0){
                    swap(nums,j+1,j);
                    j++;
                }
            }
        }
    }


    /**
     * 优雅解法 ---------------------------脑筋急转弯
     * @param nums
     */
    public static void moveZeroesNew(int[] nums) {
        int lastNonZeroFoundAt = 0; // 记录当前非零元素的位置

        // 遍历数组
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                // 如果当前元素是非零的，将它与 lastNonZeroFoundAt 位置的元素交换
                if (i != lastNonZeroFoundAt) {
                    int temp = nums[lastNonZeroFoundAt];
                    nums[lastNonZeroFoundAt] = nums[i];
                    nums[i] = temp;
                }
                lastNonZeroFoundAt++; // 更新非零元素的位置
            }
        }
    }
        //1 0 1
    public static void moveZeroesNew1(int[] nums) {
        int firstZero = 0;
        for (int i = 0; i < nums.length; i++) {
            if(nums[i] !=0){
                //说明i之前 一定有0,把最后的  和非零数互换  非零数就表示 前面firstZero 都不是0  所以只能和这个换
                if(i!=firstZero){
                    int temp = nums[firstZero];
                    nums[firstZero] = nums[i];
                    nums[i] = temp;

                }
                //firstZero  可以理解为非0个数,所以 if(nums[i] !=0){ 这里时 firstZero就应该++,表示非0数+1
                firstZero ++;
            }

        }
    }
}
